package br.com.locasis.funcionalidades;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.international.StatusMessages;

import br.com.locasis.entity.Produto;
import br.com.locasis.entity.TipoValorProduto;

@Name("cadastrarProduto")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('"+PerfilUsuario.PERFIL_PETSHOP+"')}")
public class CadastrarProduto {
	
	@In(create=true)
	private EntityManager entityManager;
	
	@In(value = "statusMessages")
	protected StatusMessages messages;
	
	private Produto produtoEdicao;
	
	private List<Produto> listaProdutos;
	
	private List<SelectItem> listaTiposValor;
	
	private Integer idTipoValor;
	
	@Out(required=false)
	private Produto produtoSelecionado;
	
	private boolean selecionadoTodos;

	public Produto getProdutoEdicao() {
		if (produtoEdicao == null) {
			produtoEdicao = new Produto();
		}
		return produtoEdicao;
	}

	public void setProdutoEdicao(Produto produtoEdicao) {
		this.produtoEdicao = produtoEdicao;
	}
	
	public Integer getIdTipoValor() {
		return idTipoValor;
	}

	public void setIdTipoValor(Integer idTipoValor) {
		this.idTipoValor = idTipoValor;
	}

	public List<SelectItem> getListaTiposValor() {
		if (listaTiposValor == null) {
			listaTiposValor = new ArrayList<SelectItem>();
			listaTiposValor.add(new SelectItem(null,"Selecione"));
			List<TipoValorProduto> lista = entityManager.createQuery("select t from TipoValorProduto t where t.flgAtivo is true").getResultList();
			for(TipoValorProduto tv : lista){
				listaTiposValor.add(new SelectItem(tv.getIdTipoValorProduto(),tv.getNome()));
			}
		}
		return listaTiposValor;
	}

	public void setListaTiposValor(List<SelectItem> listaTiposValor) {
		this.listaTiposValor = listaTiposValor;
	}

	public List<Produto> getListaProdutos() {
		if (listaProdutos == null) {
			listaProdutos = entityManager.createQuery("select p from Produto p where p.flgAtivo is true").getResultList();
		}
		return listaProdutos;
	}

	public void setListaProdutos(List<Produto> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}
	
	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public void selecionaTodos(){
		for(Produto p : getListaProdutos()){
			if(isSelecionadoTodos()){
				p.setSelecionado(true);
			}else{
				p.setSelecionado(false);
			}
		}
	}

	public void onLoad(){
		setListaProdutos(null);
		if(produtoSelecionado != null){
			produtoEdicao = produtoSelecionado;
		}
	}
	
	public void onLoadList(){
		setProdutoEdicao(null);
		produtoSelecionado = null;
	}

	public String salvar(){
		getProdutoEdicao().setTipoValorProduto(entityManager.find(TipoValorProduto.class, getIdTipoValor()));
		getProdutoEdicao().setFlgAtivo(true);
		entityManager.merge(getProdutoEdicao());
		entityManager.flush();
		messages.add(Severity.INFO,"Produto cadastrado com sucesso.");
		setProdutoEdicao(null);
		setIdTipoValor(null);
		return "persisted";
	}
	
	public String cancelar(){
		setProdutoEdicao(null);
		return "voltar";
	}
	
	public void excluir(){
		List<Produto> listaRemocao = new ArrayList<Produto>();
		for(Produto a : getListaProdutos()){
			if(a.isSelecionado()){
				a.setFlgAtivo(false);
				entityManager.merge(a);
				listaRemocao.add(a);
			}
		}
		getListaProdutos().removeAll(listaRemocao);
		entityManager.flush();
		messages.add(Severity.INFO,"Produto(s) excluído(s) com sucesso.");
	}
	
	public String novo(){
		return "novo";
	}
	
	public String editar(Produto produto){
		produtoSelecionado = produto;
		setIdTipoValor(produto.getTipoValorProduto().getIdTipoValorProduto());
		return "editar";
	}
}
